|
fawaz2000 مبرمج محترف
تاريخ التسجيل » Nov
2001
البلد » اليمن
- صنعاء
عدد
المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم |
ملاحضة : في البداية أعتذر عن
الأخطاء الإملائية وأيضا هناك نقص في الفائدة للحدث الخامس
MousDown فهوا يفيد عند ضغط زر الماوس الأيمن أو الأيسر وليس كما
هوا مكتوب سابقاُ بسبب سرعتي في الكتابة لم أنتبه لهذا .فودت
التنبيه .
بسم الله الرحمن الرحيم أشكرك أخي رغيد
وبارك الله وفيك وفعلاً إجابة السوأل هوا ماذكرت وكان بودي أن
أضع جدول أسكي كامل بشفرة html لكنها ليست مفعلة في المنتدى .
سوف أحاول إيجاد طريقة حتى يكون هذا الجدول مرجع عام لنا
.
الدرس الرابع ( مهم جداً ) : سوف نأخذ مجموعة من
الأحداث الخاصة بنافذة التصميم لذا سيعتبر هذا الدرس مع الدرس
السابق( مرجع لنا عند التصميم)
الأحداث الخاصة : كما
سبق وأن عرفتها : فهي تلك الأحداث التي ليس للماوس أو لوحة
المفاتيح بها دخل , وهي مسئوله عن تنفيذ عمل خاص بنافذة أو أداة
معينة , وسوف أذكر بعض تلك الأحداث مقارناً بها مع الأحداث
الخاصة الجديدة التي تتبع نافذة التصميم UserControl وسوف أذكر
بعض الأحداث الهامة في نافذة Form والتي تكون قريبة أو شبيهة
العمل مع أحداث UserControl وأول حدث سوف أتكلم عنه هوا
: ------------------------------------------- 1- حدث :
Form_Load :
code:
Private Sub Form_Load()
End Sub | | هذا الحدث التابع للنموذج Form :
وضيفة هامة جداً فهوا المسئول عن تنفيذ مهمة معينة قبل أن تظهر
النافذة أي أثناء تحميلها للذاكرة , واعتقد أن أغلبنا يعرف هذا
الحدث وفيما يستخدم فيمكن مثلاً في هذا الحدث أن نضع قيم
افتراضية للمتغيرات أو نستدعي إجراء أو غيرها من الوظائف
. ------------------------------------------- 2 - حدث
UserControl_Initialize :
code:
Private Sub UserControl_Initialize()
End Sub | | هذا الحدث هوا أول حدث من الأحداث
الخاصة بنافذة التصميم UserControl وهذا الحدث يقابل حدث
Form_Load تقريباً , فهذا الحدث يبدأ بالعمل عند إنشاء أي فرد من
الكائن (واحد من الكائن الجديد) أثناء التصميم (على نافذة Form)
أو أثناء تشغيل البرنامج : ملاحظة هامة جداً : عند ما نقوم
بوضع الأداة الجديدة والتي قمنا بتصميمها على نافذة Form يعتبر
محرك Visual Basic الأداة كبرنامج مستقل , فلو حدث خطأ ما مثلاً
في الأداة أثناء وضعها على نافذة Form ستظهر رسالة تخبرك بالخطأ
ثم ينتقل بك (المفسر) إلى شفرة نافذة التصميم UserControl موضحاُ
الخطأ كعادة مفسر الـVisual Basic بخلفية صفراء على السطر الخطأ
. لذلك يبدأ المفسر بترجمة الأداة وتنفيذها لحظة وضعها على
النافذة Form ابتدأً من الحدث UserControl_Initialize لذا يمكن
الاستفادة منه في وضع قيم افتراضية للمتغيرات أو غيرها من
الاحتياجات التي يحتاجها المصمم كاستدعاء إجراء
.....الخ ------------------------------------------- 3 -
UserControl_Show ووضيفة هذا الحدث تنفيذ مهمة ما عندما يتم
تغير خاصية Visible إلى True
code:
Private Sub UserControl_Show()
End Sub | | ملاحظات توضيحية حول الحدث
: 1- عند ما تكون خاصية Visible للكائن الذي أنشأناه False
فعند تشغيل البرنامج لن يعمل الحدث , بمعني في هذه الحالة هوا في
إجازة من العمل ...! بينما إذا كانت خاصية Visible هي True
فسينطلق بعد الحدث UserControl_Initialize مباشرة (
UserControl_Show ) .
لو قمنا بوضع زرين أمر ثم وضعنا
بجانبهم الأداة التي أنشأناها ووضعنا في الزر الأول الخاصية
Visible إلى True بينما الزر الثاني وضعنا الخاصية Visible بـ
False طبعاُ الخاصية التابعة لكائن الذي أنشأناه . فمتي سيعمل
هذا الحدث .... أتمنا الإجابة على هذا السؤل في مشاركاتكم حتى
أشعر أنكم قد استو عبتم هذه الأحداث .
2- لا تستقبل
الأداة(الجديدة التي صممناها) الحدثShow إذا كان النموذج (Form)
مخفياً وعرض ثانية , أو إذا كان النموذج (النافذة Form ) مصغراً
وتم استرجاعه , لآن الأداة الجديدة (التي صممناها) تضل في
النموذج ولا تتغير في هذه العمليات خاصيتها Visible .
3-
إذا تم استخدام الأداة في تصمم صفحات إنترنت (وتم استعراضها في
المتصفح ) فأن الحدث Show يعمل في حال تراجع المستخدم إلى الصفحة
التي تحوي الأداة المصممة .
4- في الإصدارات السابقة قبل
الإصدار 5.0 من Visual Basic لا تستقبل الأداة المصممة الحدث
Show في زمن التصميم , ويقصد بذلك أثناء وضعها على النموذج Form
أثناء تصميم البرنامج , بينما في الإصدارات التالية تستقبل
الأداة المصممة الحدث أثناء التصميم , وأيضاُ أثناء التشغيل,
راجع ملاحظة الحدث Initialize
. ------------------------------------------- 4-
UserControl_Resize يقع هذا الحدث أو يعمل إذا تم تغير حجم
الكائن سواء تكبير أو تصغير أو تغير الاتجاهات
code:
Private Sub UserControl_Resize()
End Sub | | واعتقد أن هذا الحدث مألوف لدي
الكثير من مبرمجي فيجول بيسك ولهذا الحدث خصائص متعلقة به وهي
على النحو التالي 1- خاصية Height : فعند استخدام هذه
الخاصية والتي وضيفتها تكبير الكائن بالنسبة للمستوى العمودي (y)
إلى الأسفل أو تصغيره إلى الأعلى , وهذا بدورة سينطلق الحدث
Resize , لأن هناك تغير حصل في هذا الكائن . 2 - خاصيةWidth :
وهي تتحكم في تكبير عرض الكائن إلى الأمام أو العكس تصغير 3
- Top : وهي تتحكم في تغير ارتفاع الكائن والارتفاع يعني تغير
موضح الكائن الحالي لذا سيعمل الحدث Resize . 5 - Left : وهذه
الخاصية تتحكم في تغير الموضع الحالي للكائن بالتدريج من اليمين
إلى اليسار .
فيعند تغير هذه الخصائص سينطلق الحدث Resize
بسبب تغير موضع الكائن . وهناك خصائص أخري مثل : ScaleWidth ,
ScaleHieght , ScaleTop , ScaleLeft , وهذه الخصائص كثير ما
سنستخدمها في تحديد المساحة الداخلية للكائن علما أن هذه الخصائص
تختلف عن الخصائص المذكورة في النقاط السابقة . ما ادري كيف
أوضحها هذه بس راح أحاول : الخصائص السابقة , Height , Width
, Top, Left , تستخدم لتحكم في المساحة الكلية للكائن مثل تغير
في الارتفاع (الحجم) أو تغير الموقع الحالي للكائن بينما الخصائص
ScaleWidth , ScaleHieght , ScaleTop , ScaleLeft تستخدم في
تحديد المساحة الداخلية للكائن , حيث يمكن عن طريق هذه الخصائص
تحديد المساحة الداخلية العليا أو اليسارية مثلاً لنرسم شيء معين
في الكائن من حوافه كمستطيل .....الخ ... سنستخدم هذه الخصائص
عند رسم الزر لذي سنصممه .
وعادة الخصائص ScaleWidth ,
ScaleHieght , ScaleTop , ScaleLeft تتعامل مع خاصية هي
ScaleMode والتي تحدد نوع وحدة القياس لنضام الإحداثيات , تفيد
عند استخدام دوال الرسم على الكائن في تحديد طريقة القياس
لإحداثيات الرسم , وهذه الأنواع من القياس هي :
القيمة
الثابت الوصف 0vbUser فيد بأن الخصائص ScaleWidth ,
ScaleHieght , ScaleTop , ScaleLeft قد ضبطت بوحدة قياس مخصصة
(حيث يمكن إنتاج وحدة قياس غير المذكورة) . vbTwips 1 (دائماً
افتراضية) و التويب (1440 تويب في كل إنش ,567 تويب في كل سم) .
vbPoints 2 (72 نقطة في كل إنش) . vbPixels 3 بيكسل (أصغر
وحدة دقة للشاشة أو الطابعة ) . vbCharacters 4 محرف (أفقياً
= 120 تويب في كل وحدة , عمودياً = 240 تويب في كل واحدة
). vbInches 5 إنش . vbMillimeters 6 ملليمتر
. vbCentimeters 7 سنتيمتر .
وهناك ملاحظات على هذه
الخاصية كثيرة ولكن سأتحدث فقط بما يتناسب مع الأداة التي سنقوم
بتصميمها
. ------------------------------------------------------- 5
- حدث UserControl_Paint : يقع هذا الحدث عند وضع الكائن على
النافذة Form , أو إذا تم تكبير الكائن أو تصغيره , أو إذا وضع
كائن ما على الكائن الخاص بنا , أو إذا وضع جزء من كائن عليه ,
أي تغطى جزء من كائنا . قريب نوعاً ما من حدث Resize
.
code:
Private Sub UserControl_Paint()
End Sub | | على سبيل التوضيح قم بالتالي
: في نافذة UserControl غير خاصية BackColor إلى ألون الأسود
ثم ضع الكود MsgBox "Piant" في الحدث ثم قم بإغلاق النافذة ,
وهذه الخطوة مهمة جدا جداً التي هي إغلاق النافذة UserControl
حيث لن تتمكن من وضع الكائن على نافذة Form في حال كانت نافذة
UserControl مفتوحة سواء واجهة الكود أو واجهة التصميم لذا انتبه
لهذه الخطوة , فإن رأيت رمز الكائن على شريط الأدوات غير مفعل
فعلم أنك لم تقم بإغلاق نافذته , بعد ذلك ضع الأداة على النافذة
Form ستلاحظ ظهور الرسالة المذكورة وعند تحريكه لن تظهر الرسالة
ولكن جرب أن تقوم بتكبيره أو تصغيره سوف تلاحظ ظهور الرسالة
(باستخدام الماوس) أما إذا قمت بتحريكه باستخدام لوحة المفاتيح
فسيقع الحدث وتظهر لك الرسالة (يتم التحريك كما يلي : قم
بالتأشير على الكائن ثم اضغط مفتاح Ctrl وضغط أحد الأسهم كرر
الضغط على السهم لتحريك الكائن ) , ولكي يتبين كيف يقع الحدث عند
وقوع كائن علية قم بوضع زر أمر ليغطي نصف الكائن ثم قم بتحريك
الكائن ليظهر الجزء المغطى وهكذا...... . ملاحظة : إذا
تكررت الرسالة بحث لم تعد قادراً على الرجوع للنموذج اضغط مفتاح
Ctrl + Pause Break بعدها 'ضغط زر التوقيف . فيفيد هذا الحدث
للتأكد من رسم عملية على الكائن مرة أخرى , في حال استخدم في
الكائن دوال رسم . كنت فيما سبق اذكر أن حدث قد يرتبط بخاصية
معينة ولكن في هذا الحدث سيرتبط مع خاصية (Properties) وطريقة
(Method) حيث تستدعي الطريقة Refresh الحدث Piant بينما الخاصية
AutoReDraw إذا كانت بـTrue في هذه الحالة سيكون إعادة الرسم أو
التلوين تلقائياُ . لذا إذا كانت الخاصية AutoReDraw بـTrue لن
يكون لهذا الحدث أي فائدة لأن هذه الخاصية تحل محل هذا الحدث .
حيث ألياُ تسمح بإعادة رسم النماذج وصناديق الصور. وتكتب النصوص
والصور على الشاشة , ويحفظ صورة عنها في الذاكرة وعند ذلك لا
حاجة لأن يتلقى الكائن حدث الرسمPiant بغية إعادة الرسم إذا كان
الرسم يعاد تلقائياُ من محتويات الذاكرة
. -------------------------------------------------- 6 -
حدث UserControl_Terminate وضيفة هذا الحدث تماماُ هي وضيفة
حدث Form_Unload حيث يعمل هذا الحدث عند حذف فرد من أفراد الكائن
من على النافذة Form ليقوم بتفريغ الذاكرة من الجزء الذي كان
حاجزه فيها .
ملاحظة : عندما أتحدث عن فرد من أفراد
الكائن , توضيح : الكائنات تقسم حسب وضعها إلى عائلات حيث مثلاً
لو وضعت زر أمر على النافذة ثم قمت بتغير اسمه , فسيعتبر هذا
الزر من عائلات CommandButton , وهوا عند وضعه في النموذج يمثل
فرد من أفراد العائلة CommandButton , بينما صندوق النص Text1
يمثل فرد من عائلة TextBox وهكذا , لذا نحن عندما نصمم كائن
سنحدد العائلة الذي ينتمي إلية الكائن , عند تغير إسم كان أنضر
لعنوان نافذة الخصائص حيث تعرض عالة الأداة مع الاسم الحالي الذي
قام المستخدم بتغيره (أو لم يغيره) حيث إسم الكائن بالخط العريض
بينما العائلة بالخط المجاور.
سأقوم بتوضيح الحدث Unload
التابع للنافذة Form كما يلي
. --------------------------------------------------- 7-
الحدث Form_Unload يقع هذا الحدث عند إنهاء البرنامج ليقوم
بحذف( تفريغ ) النموذج Form من الذاكرة :
code:
Private Sub Form_Unload(Cancel As Integer)
End Sub | | وهناك باراميتر لهذا الحدث وهوا
Cancel As Integer حيث يفيد هذا الجزء أو الباراميتر في إلغاء
أمر إنهاء البرنامج أو تفعيله بالنسبة لزر الإغلاق الموجود
على شريط العنوان الذي يحمل شكل(x) فعندما يعطي الباراميتر
القيمة 1 فسيمنع عمل زر الإغلاق أما إذا كانت القيمة 0
فسيتيح الإغلاق باستخدام زر الإغلاق يوضح المثال التالي كيف يمكن
عدم تفعيل زر الإغلاق الخاص بالنافذة
code:
Private Sub Form_Unload(Cancel As Integer)
Cancel = 1
End Sub | | راجع تقنية الاستدعاء الذاتي الذي
تكلم عنه الأخ العزيز رغيد الطيب
. ----------------------------------------- 8 - الحدث
UserControl_LostFocus : يستخدم عندما يذهب التركيز عن الكائن
أو ينتقل إلى كائن أخر .
code:
Private Sub UserControl_LostFocus()
End Sub | | ملاحظة جداً مهمة لنا كمصممين :
يعتبر هذا الحدث خاص بنافذة UserControl (طبعاً هناك بعض
الأحداث سيرثها الكائن من نافذة التصميم منها هذا الحدث , وغيرها
من الأحداث التي سيتم توضيحها في الدروس القادمة ) ويختلف عن
الحدث المعروف LostFocus الذي يعالج الأدوات المنتجة وإنما هذا
الحدث هوا لغرض داخلي يستفيد منه المصمم فيفيد هذا الحدث في
معرفة ما إذا كان التركيز علية الآن أم لا لرسم التركيز على الزر
أو لتنفيذ مهمة ما . الخاصية المرتبطة مع الحدث : خاصية
CanGetFocus عندما تكون بـTrue تتيح للكائن أن يحصل على التركيز
, وليس هناك أدوات أخرى يمكن أن تتلقى التركيز . ملاحظة
: يطلق الحدث LostFocus قبل الحدث ExitFocus
. ----------------------------------------- 9 -
UserControl_ExitFocus ينفذ هذا الحدث عند مغادرة التركيز أحد
أفراد للكائن .
code:
Private Sub UserControl_ExitFocus()
End Sub | | يفيد هذا الحدث إذا احتاج الكائن
معرفة إن كان التركيز يغادره الآن . حيث يقع مباشرة بعد الحدث
رقم 9 . ---------------------------------------- 10 -
الحدث UserControl_EnterFocus ينفذ هذا الحدث عندما يدخل
التركيز إلى أحد أفراد الكائن يفيد في معرفة ما إذا كان
الحدث يقع الآن بداخلة أم لا .
ملاحظة :
يقلع هذا
الحدث قبل الحدثGotFocus
. --------------------------------------- 11 - الحدث
UserControl_GotFocus : يستخدم في حال انتقل التركيز من كائن
ما إلى الكائن الحالي (المصمم) . حيث هذا الحدث خاص بالمصمم
لمعرفة فيما إذا انتقل التركيز إلى الكائن الحالي (المصمم) أم لا
وليس كالحدث العام GotFocus الذي يستخدمه المبرمج والذي يحدد
التركيز بالنسبة للكائنات بشكل عام .
سؤال مهم جداُ جداُ
.........الخ : أعتقد قطعاً ورود سؤل ما هوا الفائدة من
استخدم EnterFocus طالما أن الحدث GotFocus يقوم بالمهمة
: أيضاُ الحدث ExitFocus طالما أن الحدث LostFocus يقوم بنفس
المهمة لآني سألت نفسي هذا السؤل من قبل وتوصلت للناتج بعد عناء
وهوا التالي : ذكرت في ملاحظة سابقة أن هناك عائلات من
الكائنات عند وضع فرد من العائلة في النافذة يعتبر هذا فرد من
أفراد كائن (راجع الملاحظة السابقة ) لذلك ينفذ الحدثين
GotFocus و LostFocus في حال وجد أي فرد من أفراد العائلة فإذا
انتقل التركيز لفرد ثاني من أفراد العائلة لن تنفذ هذه الأحدث
لأنها في حال وجدت أي فرد من العائلة تتوقف من العمل لذلك وجدت
الأحداثExitFocus و EnterFocus لتقوم بفحص التركيز في حال تم
انتقاله بين أفراد الكائن . مثلا لو قمنا بتصميم كائن (زر) وعند
وضع الزر على النموذج وكان بجانبه أداة نص مثلاً فعند انتقال
التركيز من أداة النص إلى الزر فسيقع الحدث GotFocus بينما العكس
سيقع الحدث LostFocus , طيب الآن لو قمنا بوضع زر بجانب الزر
الأول (المصمم - يعني من نفس العائلة ) ثم نقلنا التركيز إلى
الزر الأول فسيقع الحدث GotFocus ثم بعد ذلك نقلنا التركيز إلى
الزر الثاني والذي هوا من نفس العائلة ففي هذه الحالة لن ينفذ
حدث GotFocus لأن هذا الحدث كما ذكرت وضيفته العمل عند ما يقع
أول مرة على فرد من العائلة فإذا تكرر الفرد لن يعمل وسيعمل عند
التنقل بين أفراد العائلة الحدث (إذا وقع التركيز على الفرد)
EnterFocus
أتمنا أن تكون هذه الملاحظة وفت بالإجابة
ويمكن اختبار الأحداث المذكورة بوضع رسالة معينة بداخل كل
حدث وعند وضع عدد من الكائن على النموذج جرب النقر على الأول
وأنضر الرسالة ثم الثاني ثم انتقل إلى عائلة ثانية كصندوق النص
ثم عود ونقر على أحر أفراد الكائن وهكذا لترى الفرق
. --------------------------------------------------------------------------- أشعر
أن الدرس قد طال نوعا ما وبه معلومات هامة لذا أرجو الإطلاع
عليها والتفكر بها جيداً لأن عملنا منصب على هذه الأحدث , وإن لم
يفهم حدث نضراُ لعدم فهم المصطلحات الخاصة به فأقول أننضر قلياً
حتى نبدأ بالتعامل معها لتفهمها أكثر .
في حال ورود
ملاحظة أو إضافة يسرني ذكرها .
وإلى اللقاء في الدرس
القادم الذي لا أعرف هل سوف أواصل بالأحداث ثم الدوال أو أبدأ
بشرح طرق برمجة الخصائص فالأمر مطروح لكم فماذا تريدون
.
السلام عليكم ورحمة الله وبركاته .
__________________ الإيمان
يمان والحكمة يمانية
أخبر
المراقب عن هذا الرد | رقم
الـ IP | تحرير
التوقيع |